package com.yjdb.sanyuantang.modules.Admin.service.Impl;

import com.yjdb.sanyuantang.common.entity.SysLimit;
import com.yjdb.sanyuantang.common.mapper.SysLimitMapper;
import com.yjdb.sanyuantang.modules.Admin.DTO.limit.LimitDTO;
import com.yjdb.sanyuantang.modules.Admin.DTO.limit.LimitListDTO;
import com.yjdb.sanyuantang.modules.Admin.mapper.AdminLimitMapper;
import com.yjdb.sanyuantang.modules.Admin.service.AdminLimitService;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * packageName com.yjdb.sanyuantang.modules.Admin.service.Impl
 *
 * @author 混沌酱
 * @version 1.0
 * @className AdminLimitServiceImpl
 * @date 2024/3/15
 * @description TODO
 */
@Service
public class AdminLimitServiceImpl implements AdminLimitService {

    @Resource
    private SysLimitMapper sysLimitMapper;

    @Resource
    private AdminLimitMapper adminLimitMapper;

    /**
     *
     * @param limitDTO
     */
    @Override
    public void addRole(LimitDTO limitDTO) {
        SysLimit sysLimit = new SysLimit();
        BeanUtils.copyProperties(limitDTO, sysLimit);
        sysLimitMapper.insert(sysLimit);
    }

    /**
     *
     * @param sysLimit
     */
    @Override
    public void updateRole(SysLimit sysLimit) {
        sysLimitMapper.updateById(sysLimit);
    }

    @Override
    public void delete(Integer id) {
        adminLimitMapper.deleteLimit(id);
    }

    @Override
    public List<LimitListDTO> list() {
        // 获取所有权限
        List<SysLimit> all = sysLimitMapper.selectList(null);
        List<LimitListDTO> result = new ArrayList<>();
        for (SysLimit limit : all) {
            LimitListDTO limitListDTO = new LimitListDTO();
            BeanUtils.copyProperties(limit, limitListDTO);
            result.add(limitListDTO);
        }
        return buildLimitTree(result, null);
    }

    // 构建权限树
    public List<LimitListDTO> buildLimitTree(List<LimitListDTO> limits, Long parentId) {
        List<LimitListDTO> result = new ArrayList<>();
        for (LimitListDTO limit : limits) {
            if (Objects.equals(parentId, limit.getBindId())) {
                List<LimitListDTO> children = buildLimitTree(limits, limit.getId());
                limit.setChildren(children);
                result.add(limit);
            }
        }
        return result;
    }
}
